package com.mgq.netty.bytebuff;

import java.nio.ByteBuffer;

/**
 * byteBuff的粘包和拆包演示
 * 假设消息发送前是 Hello world \n
 * I'm zhangsan \n
 * How are you ? \n
 * 消息以\n分割,假设发送时发生了粘包现象
 * 演示如何进行拆包
 */
public class TestByteBuffExam {
    public static void main(String[] args) {
        ByteBuffer source = ByteBuffer.allocate(32);
        source.put("hello,world,\n,I'm zhangsan \nHo".getBytes());
        split(source);
        source.put("w are you ?\n".getBytes());
        split(source);
    }

    //拆包演示
    private static void split(ByteBuffer source) {
        //切换为读模式
        source.flip();
        System.out.println(source.limit());
        for (int i = 0; i < source.limit(); i++) {
            if (source.get(i) == '\n') {
                //第一次position=0,第二次position=\n后面的位置
                int length = i + 1 - source.position();
                //分配的长度应该是读取的长度
                ByteBuffer target = ByteBuffer.allocate(length);
                for (int j = 0; j < length; j++) {
                    target.put(source.get());
                }
                ByteBufferUtil.debugAll(target);
            }
        }

        //切换为写模式,不能使用clear(),可能会有数据没有读完
        source.compact();
    }
}
